package edu.ccut.saturn.basecomponent.dataoperationcomponent;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import edu.ccut.saturn.component.DefaultComponent;
import edu.ccut.saturn.component.IParameterContext;
import edu.ccut.saturn.component.SaturnData;
import edu.ccut.saturn.component.SaturnDataManager;

public class CreateParameter extends DefaultComponent {

	@SuppressWarnings("unchecked")
	@Override
	public void execute(IParameterContext parameterContext) throws Exception {
		String classType = (String) parameterContext.getParameterValue(0);
		String fullkey = (String) parameterContext.getParameterValue(1);

		if (fullkey == null || "".equals(fullkey)) {

			if (classType != null || !classType.equals("")) {

				if (Object.class.getName().equals(classType)
						|| Object.class.getSimpleName().equals(classType)) {

					parameterContext.setParameter(2, "");

				} else if (CreateParameter.isBoolean(classType)) {
					parameterContext.setParameter(2, false);

				} else if (CreateParameter.isByte(classType)) {
					parameterContext.setParameter(2, Byte.parseByte("0"));

				} else if (CreateParameter.isCharacter(classType)) {
					parameterContext.setParameter(2, Character.valueOf('0'));

				} else if (CreateParameter.isDecimal(classType)) {
					parameterContext.setParameter(2, BigDecimal.valueOf(0));

				} else if (CreateParameter.isDouble(classType)) {
					parameterContext.setParameter(2, Double.parseDouble("0"));

				} else if (CreateParameter.isFloat(classType)) {
					parameterContext.setParameter(2, Float.parseFloat("0"));

				} else if (CreateParameter.isInteger(classType)) {
					parameterContext.setParameter(2, 0);

				} else if (ArrayList.class.getName().equals(classType)
						|| ArrayList.class.getSimpleName().equals(classType)) {

					parameterContext.setParameter(2, new ArrayList());

				} else if (CreateParameter.isLong(classType)) {
					parameterContext.setParameter(2, Long.parseLong("0"));

				} else if (CreateParameter.isShort(classType)) {
					parameterContext.setParameter(2, Short.parseShort("0"));

				} else if (CreateParameter.isString(classType)) {
					parameterContext.setParameter(2, "");

				} else if (LinkedList.class.getSimpleName().equals(classType)
						|| LinkedList.class.getName().equals(classType)) {

					parameterContext.setParameter(2, new LinkedList());

				} else if (List.class.getSimpleName().equals(classType)
						|| List.class.getName().equals(classType)) {

					parameterContext.setParameter(2, new ArrayList());
				}
			}
		} else {
			SaturnData saturnData = SaturnDataManager.getInstance().createData(
					fullkey);

			parameterContext.setParameter(2, saturnData);
		}
	}

	public static boolean isInteger(String classType) {
		return Integer.class.getName().equals(classType)
				|| Integer.class.getSimpleName().equals(classType)
				|| "int".equals(classType);
	}

	public static boolean isDecimal(String classType) {
		return BigDecimal.class.getName().equals(classType)
				|| BigDecimal.class.getSimpleName().equals(classType)
				|| "decimal".equals(classType);
	}

	public static boolean isDouble(String classType) {
		return Double.class.getName().equals(classType)
				|| Double.class.getSimpleName().equals(classType)
				|| "double".equals(classType);
	}

	public static boolean isFloat(String classType) {
		return Float.class.getName().equals(classType)
				|| Float.class.getSimpleName().equals(classType)
				|| "float".equals(classType);
	}

	public static boolean isBoolean(String classType) {
		return Boolean.class.getName().equals(classType)
				|| Boolean.class.getSimpleName().equals(classType)
				|| "boolean".equals(classType);
	}

	public static boolean isCharacter(String classType) {
		return Character.class.getName().equals(classType)
				|| Character.class.getSimpleName().equals(classType)
				|| "char".equals(classType);
	}

	public static boolean isByte(String classType) {
		return Byte.class.getName().equals(classType)
				|| Byte.class.getSimpleName().equals(classType)
				|| "byte".equals(classType);
	}

	public static boolean isShort(String classType) {
		return Short.class.getName().equals(classType)
				|| Short.class.getSimpleName().equals(classType)
				|| "short".equals(classType);
	}

	public static boolean isLong(String classType) {
		return Long.class.getName().equals(classType)
				|| Long.class.getSimpleName().equals(classType)
				|| "long".equals(classType);
	}

	public static boolean isList(String classType) {
		return List.class.getName().equals(classType)
				|| List.class.getSimpleName().equals(classType)
				|| "list".equals(classType)
				|| ArrayList.class.getName().equals(classType)
				|| ArrayList.class.getSimpleName().equals(classType)
				|| "arrayList".equals(classType)
				|| LinkedList.class.getName().equals(classType)
				|| LinkedList.class.getSimpleName().equals(classType)
				|| "linkedList".equals(classType);
	}

	public static boolean isSaturnData(String classType) {
		return SaturnData.class.getName().equals(classType)
				|| SaturnData.class.getSimpleName().equals(classType)
				|| "saturnData".equals(classType);
	}

	public static boolean isString(String classType) {
		return String.class.getName().equals(classType)
				|| String.class.getSimpleName().equals(classType)
				|| "string".equals(classType);
	}
}